import axios from 'axios'
import qs from 'qs'
import * as _ from '../util/tool'
import router from '../router/router'
import store from '../store/store'
import * as types from '../store/types'

// create an axios instance
const service = axios.create({
  baseURL: env.BASE_API, // url = base url + request url
  withCredentials: false, // send cookies when cross-domain requests
  timeout: 25000 // request timeout
})

// request interceptor
service.interceptors.request.use(
  config => {
    // do something before request is sent
    if (store.state.token) {  // 判断是否存在token，如果存在的话，则每个http header都加上token
      config.headers.Authorization = `${store.state.token}`
    }
    if (store.state.appKey) {
      config.headers.appKey = `${store.state.appKey}`
    }
    if (config.method === 'post' && config.data) {
      console.log('config.data')
      console.log(config.data)
      config.data = qs.stringify(config.data)
    }
    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    _.toast('错误的传参', 'fail')
    return Promise.reject(error)
  }
)

// response interceptor
service.interceptors.response.use(
  /**
   * If you want to get http information such as headers or status
   * Please return  response => response
  */

  /**
   * Determine the request status by custom code
   * Here is just an example
   * You can also judge the status by HTTP Status Code
   */
  response => {
    console.log('response',response)//
    if (response.headers['content-type'] === 'images/jpeg') {
      return response
    }
    const res = response.data
    if(response.headers.token){
      //如果后台通过header返回token，说明token已经更新，则更新客户端本地token
      store.commit('RESETTOKEN',{token:response.headers.token})
    }
    // if the custom code is not 20000, it is judged as an error.
    /* if (res.code !== 20000) {
      Message({
        message: res.msg || 'error',
        type: 'error',
        duration: 5 * 1000
      })

      // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
      if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
        // to re-login
        MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
          confirmButtonText: 'Re-Login',
          cancelButtonText: 'Cancel',
          type: 'warning'
        }).then(() => {
          store.dispatch('user/resetToken').then(() => {
            location.reload()
          })
        })
      }
      return Promise.reject(res)
    } else {
      return res
    } */
    return res
  },
  error => {
    if (error.response) {
      switch (error.response.status) {
        case 401:
          // 返回 401 清除token信息并跳转到登录页面
          console.log("走清除token")
          store.commit(types.LOGOUT)
          window.localStorage.removeItem("token")
          window.localStorage.removeItem("account")
          window.localStorage.setItem('referrer', router.currentRoute.fullPath)
          router.replace({
            path: 'login',
            query: {redirect: router.currentRoute.fullPath}
          })
          break
          that.$toast('登陆状态失效')
        case 500:
          /* router.replace({
            path: 'error',
            query: {redirect: router.currentRoute.fullPath}
          }) */
          _.toast('服务器异常')
          break
      }
    }
    _.toast('网络异常')
    return Promise.reject(error)
  }
)

export default service
